<?php


namespace App\Libraries;

/*
 * 图片上传功能模块
 *
 */

class UploadApp{
    private $user_post_file = array();	//用户上传的文件
    private $save_file_path;	//存放用户上传文件的路径
    private $max_file_size;	//文件上传的最大尺寸
    private $last_error;	//记录上传出错信息
    private $allow_type = array('gif','jpg','png','jpeg','ico',"apk");	//默认允许用户上传的文件类型
    private $final_file_path;	//上传文件最终保存的文件名

    //set_name  上传后图片名
    //file      上传名
    function upload($file,$set_name='',$type=''){
        $size=2000000000;
        if($type != ''){
            $this->allow_type = $type;   //获取上传文件类型
        }
        $this->max_file_size = $size;	//如果用户不填写文件大小，默认为2MB
        $this->user_post_file = $file;  //获取上传名
        $this->save_file_path = "upload/"; //获取上传路径
        $saveas = '';
        if($this->user_post_file['error']==0){
            //取当前文件名、临时文件名、大小、扩展名、后面将用到
            $tmpname = $this->user_post_file['tmp_name'];     //取得当前文件名
            $size = $this->user_post_file['size'];                        //取得当名文件大小
            $mime_type = $this->user_post_file['type'];            //取得当前文件的名
            $type = $this->getFileExt($this->user_post_file['name']);
            //检测当前上传文件是否非法提交
            if(!is_uploaded_file($tmpname)){
                $this->last_error = '非法上传文件';
                $this->halt($this->last_error);
            }
            if(!$this->checkType($type)){
                //判断上传文件的扩展名是否合法
                $this->last_error = '上传文件不合法：'. $type;
                $this->halt($this->last_error);
            }
            if(!$this->checkSize($size)){
                $this->last_error = '上传文件不得超过限定大小';
                $this->halt($this->last_error);
            }
            //重新给上传的文件命名
            if(!empty($set_name)){
                $basename = $set_name;
            }else{
                $basename = time();
            }
            $saveas = $basename.'.'.$type;//移动后的文件名
            //组合新文件名在存到指定目录下，格式：存储路径+文件名+时间+扩展名
            if(!file_exists($this->save_file_path)){
                mkdir(iconv("UTF-8", "GBK", $this->save_file_path),0777,true);
            }
            $this->final_file_path = $this->save_file_path.$saveas;
            if(! move_uploaded_file($tmpname, $this->final_file_path)){
                $this->last_error = $this->user_post_file['error'];
                $this->halt('上传失败');
                exit;
            }
            return $this->final_file_path;//返回加后缀的文件名
        }else{
            switch($this->user_post_file['error']){
                case 1:
                    $this->halt('上传的文件超过了php.ini中设置的上限大小');
                    break;
                case 2:
                    $this->halt('上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值');
                    break;
                case 3:
                    $this->halt('文件只有部分被上传');
                    break;
                case 4:
                    $this->halt('没有文件被上传');
                    break;
                case 6:
                    $this->halt('找不到临时文件夹');
                    break;
                case 7:
                    $this->halt('文件写入失败');
                    break;
                default:
                    $this->halt('上传失败');
            }
        }
    }

    //上传文件最终保存的路径
    function getSaveInfo(){
        return $this->save_info;
    }

    //判断用户上传的文件的大小是否符合规定
    function checkSize($size){
        if($size > $this->max_file_size){
            return false;
        }else{
            return true;
        }
    }
    //判断用户上传的文件类型是否合法
    function checkType($extension){
        $extension=strtolower($extension);
        if(in_array($extension,$this->allow_type)){
            return true;
        }else{
            return false;
        }
    }
    //显示报错信息
    function halt($msg){
        echo "<script>alert('".$msg."');javascript:history.go(-1);</script>";
        exit;
    }
    //获取扩展名
    function getFileExt($filename){
        $stuff = pathinfo($filename);
        return $stuff['extension'];
    }
    //获取上传文件名（不包括扩展名）
    /*	function getBaseName($basename, $type){
            $basename = basename($filename, $type);
            return $basename;
        }*/
}
?>